/**
 * Ajax 同步提交数据
 *
 * @param         url                                     String     
 * @param         parameters                        String     
 * 
 * @return         收到的相应Str                     String
 * @exception 
 */
function  extPostSync(url,parameters ){
	var returnValue="";
	Ext.Ajax.request({
	    url:url,
		method:'POST',
		timeout:6000000,
		async : false,//实时
		params :  parameters,
		success: function(response, opts) {
			returnValue =  response.responseText ;
		},
	     failure: function(response, opts) {
	         alert('同步提交函数错误（extPostSync）！'+response.status);
	     }
	});
	return returnValue;
}


/**
 * Ajax 异步提交数据
 *
 * @param         url                                     String     
 * @param         parameters                        String     
 * @param         callBackFun                       function          
 * 
 * @return 
 * @exception 
 */
function  extPostASync(url,parameters,callBackFun){
	if(typeof(callBackFun)!='function'){
		alert('异步提交函数错误（extPostASync）！【入参：回调函数callBackFun 不可为空】');
		return;
	}
	Ext.Ajax.request({
	    url:url,
		method:'POST',
		timeout:6000000,
		async : true,//实时
		params :  parameters,
		success: function(response, opts) {
			var returnValue =  response.responseText ;
			callBackFun(returnValue);
		},
	     failure: function(response, opts) {
	         alert('异步提交函数错误（extPostASync）！'+response.status);
	     }
	});
 
}


/**
 * 校验Ext所有组件
 *
 * @param         formId                       String    目标form目标表单ID，当formId为空时，则校验所有的字段,跨越多个from
 * 
 * @return 
 * @exception 
 */	
function extCheckForm( formId ){
	var formFlag=false;
	if(formId==null||formId==""||typeof(formId)=='undefined'){
		formFlag=false;
	}else{
		formFlag=true;
	}
 
	var queryStr="";
	if(formFlag){
		queryStr="field[bindFormId='"+formId+"']";
	}else{
		queryStr="field";
	}
	
	var errFlag= false;
	//校验错误
    var items = Ext.ComponentQuery.query(queryStr);
   	for(var i=0;i<items.length;i++){
	if(items[i].isXType('textfield')){ 
			var flag = items[i].validate(); 
			if(flag){
				
			}else{
				errFlag =true;
			}
		}
   	}
 	if(errFlag==true){
   		return false;
   	}{
   		return true;
   	} 
}	
	

 
/**
 * 拼装PostParams
 *
 * @param         formId                       String    目标form目标表单ID，当formId为空时，则根据name拼装所有的字段,跨越多个from
 * 
 * @return 
 * @exception 
 */	
function extAssemblePostParams(   formId    ){
	var formFlag=false;
	if(formId==null||formId==""||typeof(formId)=='undefined'){
		formFlag=false;
	}else{
		formFlag=true;
	}
 
	var param = "";
    var obj = JSON.parse("{}");
	var paramsStr="";
	var queryStr1="";
	var queryStr2="";
	if(formFlag){
		queryStr1="field[bindFormId='"+formId+"']";
		queryStr2="checkboxgroup[bindFormId='"+formId+"']";
	}else{
		queryStr1="field";
		queryStr2="checkboxgroup";
	}
 
    var items = Ext.ComponentQuery.query(queryStr1);
   	for(var i=0;i<items.length;i++){
   		var name=items[i].getName();
   		var val=getCmpStrValueByObj(items[i]);
   		paramsStr=paramsStr+"&"+name+"="+encodeURIComponent(val);
//		if(items[i].isXType('datefield') ){ //datefield
//   			var value=items[i].getValue();
//   			var name=items[i].getName();
//   			var val = Ext.util.Format.date(value, items[i].format) ;  
//			paramsStr=paramsStr+"&"+name+"="+encodeURIComponent(val);
//				
//   		}else if(items[i].isXType('combobox') ){
//			var value=items[i].getValue();
//   			var name=items[i].getName();
//			if(value==null){
//					value="";
//			}
//			paramsStr=paramsStr+"&"+name+"="+encodeURIComponent(value);
//			
//		}else if(items[i].isXType('radiofield') ){ //datefield
//   			 
//   		}else if(items[i].isXType('hiddenfield') ){ //hiddenfield
//   			var value=items[i].getValue();
//   			var name=items[i].getName();
//   			paramsStr=paramsStr+"&"+name+"="+encodeURIComponent(value);
//   		}else if(items[i].isXType('numberfield')){ //numberfield
//   			var value=items[i].getValue();
//   			var name=items[i].getName();
//   			if(value==null||value=='null'){
//   				value='';
//   			}
//   			paramsStr=paramsStr+"&"+name+"="+encodeURIComponent(value);
//   		}else if(items[i].isXType('textfield')){//其它所有录入1
//   			var value=items[i].getValue();
//   			var name=items[i].getName();
//				paramsStr=paramsStr+"&"+name+"="+encodeURIComponent(value);
//   		}
   	}
 
	var items2 = Ext.ComponentQuery.query(queryStr2);
	for(var i=0;i<items2.length;i++){		  
			 if(items2[i].isXType('radiogroup') ){
				 var values=items2[i].getChecked();
				 if(values==null||values.length==0){
					 
				 }else{
					var name=items2[i].getName();
					paramsStr=paramsStr+"&"+name+"="+encodeURIComponent(values[0].inputValue);
				 }
 
			 }else if(items2[i].isXType('checkboxgroup')){
				 var values=items2[i].getChecked();
				 if(values==null||values.length==0){
					 
				 }else{
					var name=items2[i].getName();
					for(var j=0;j<values.length;j++){
						paramsStr=paramsStr+"&"+name+"="+encodeURIComponent(values[j].inputValue);
					}
			 }
		 }
	}
	return  paramsStr;
}


/**
 * 回填extBindFormByJson
 *
 * @param         jsonData                    JSON     回填数据
 * @param         formId                       String    目标form目标表单ID，当formId为空时，则根据name自动回帮,跨越多个from
 * 
 * @return 
 * @exception 
 */	
function extBindFormByJson(jsonData,formId){
 
	var formFlag=false;
	if(formId==null||formId==""||typeof(formId)=='undefined'){
		formFlag=false;
	}else{
		formFlag=true;
	}
	
	if(jsonData==null||typeof(jsonData)=='undefined'){
		return;
	}
	for(var item in jsonData){
		var jsonTmpValue=jsonData[item];
		
		var queryStr="";
		
		if(formFlag){
			queryStr="field[name='"+item+"'][bindFormId='"+formId+"']";
		}else{
			queryStr="field[name='"+item+"']";
		}
		
		var items = Ext.ComponentQuery.query('field[name="'+item+'"]');
		if(items!=null&&items.length>0){
			var extField=items[0];
      		if(extField.isXType('datefield') ){ //datefield
      			var date = Ext.Date.parse(jsonTmpValue, extField.format   );
      			//extField.setValue(date);
      			setCmpValue(extField,date,false);
      		}else if(extField.isXType('combobox') ){ //combobox
      			//extField.setValue(jsonTmpValue);
      			setCmpValue(extField,jsonTmpValue,false);
      		}else if(extField.isXType('checkbox') ){ //checkbox
      			//extField.setValue(jsonTmpValue);
      			setCmpValue(extField,jsonTmpValue,false);
      		}else if(extField.isXType('hiddenfield') ){ //hiddenfield
      			//extField.setValue(jsonTmpValue);
      			setCmpValue(extField,jsonTmpValue,false);
      		} 
      		//checkbox radio popfield 
      		
      		//onchange事件
      		else if(extField.isXType('textfield')){//其它所有录入 
      			//extField.setValue(jsonTmpValue);
      			setCmpValue(extField,jsonTmpValue,false);
      		}
		}
	}
}

/**
 * 等待框
 * 
 * @return 
 * @exception 
 */	
function extWait(){
	Ext.MessageBox.show({
	    title: 'Please wait',
	    progressText: 'Initializing...',
	    width:300,
	    wait: {
            interval: 200
        },
	    progress:true,
	    closable:false
	});
}

/**
 * 取消等待框
 * 
 * @return 
 * @exception 
 */	
function extNotify(){
	 Ext.MessageBox.hide();
}
 
/**
 * 提示错误
 * 
 * @return 
 * @exception 
 */	
function extShowError(errorMsg){
		if(msgType=="1"){
 			alert(errorMsg);
 		}else{
 			  Ext.MessageBox.show({
 		           title: 'Error',
 		           msg: errorMsg,
 		           buttons: Ext.MessageBox.OK,
 		           icon: Ext.MessageBox['ERROR']
 		       });
 		}
 		errorDialogFlag=true; 		
 		return true;
}
 
/**
 * 提示错误
 * 
 * @param         json                    JSON      
 * @return 
 * @exception 
 */	
function extShowErrorByJson(json){
	if(!("frameControlIsError" in json)|| !("frameControlErrorMessage" in json)){
 		alert("showErrorByJson函数错误，json未包含指定字段：'frameControlIsError' 'frameControlErrorMessage'");
 		return false;
 	}
 	var frameControlIsError=json["frameControlIsError"];
 	var frameControlErrorMessage=json["frameControlErrorMessage"];
 	if(frameControlIsError=="1"){
 		extShowError(frameControlErrorMessage);
 		errorDialogFlag=true;
 		return true;
 	}else{
 	 	errorDialogFlag=false;
 		return false;
 	}
}

/**
 * 提示错误
 * 
 * @param         from                    表单对象      
 * @return 
 * @exception 
 */	
function extShowErrorByForm(targetForm){
	if( targetForm==null || typeof(targetForm)=='undefined'){
 		alert("extShowErrorByForm函数错误，from 不可为空。");
 		return false;
 	}
	var isErrorFlag = Ext.getCmp(targetForm.id+"_frameControlIsError").getValue();	
	var errorMsg = Ext.getCmp(targetForm.id+"_frameControlErrorMessage").getValue();	
 	if(isErrorFlag=="1"){
 		extShowError(errorMsg);
 		errorDialogFlag=true;
 		return true;
 	}else{
 	 	errorDialogFlag=false;
 		return false;
 	}
}

 
/**
 * 弹出显示提示
 *
 * @param  backMsg  提示信息
 * @return 
 * @exception 
 */	     
 function extShowMessage(backMsg){
 		if(msgType=="1"){
 			alert(backMsg);
 		}else{
			  Ext.MessageBox.show({
		           title: 'Info',
		           msg: backMsg,
		           buttons: Ext.MessageBox.OK,
		           icon: Ext.MessageBox['INFO']
		       });
 		}	
 		messageDialogFlag=true;
 		return true;	
}
 
 /**
  * 弹出显示提示
  *
 * @param         from                    表单对象     
  * @return 
  * @exception 
  */	    
 function extShowMessageByForm(targetForm){
		if( targetForm==null || typeof(targetForm)=='undefined'){
	 		alert("extShowMessageByForm函数错误，from 不可为空。");
	 		return false;
	 	}
		var backMsg = Ext.getCmp(targetForm.id+"_frameControlBackMessage").getValue();	
	 	if(backMsg!=""&&backMsg!=null){
			if(msgType=="1"){
	 			alert(backMsg);
	 		}else{
	 			extShowMessage(backMsg)
	 		}
	 		messageDialogFlag=true;
	 		return true;
	 	}else{
			messageDialogFlag=false; 	
	 		return false;
	 	}
} 


/**
 * 利用Ajax无缝提交目标Form,异步提交
 *
 * @param         formId                      String    目标form目标表单ID 
 * @param         submitFunction         String    提交方法名称
 * @param         isAutoRebind             boolean    知否自动反绑
 * @param         rebindFunction          String    手动反帮方法名称
 * @param         beforeFunction          String    前序方法名称
 * @param         afterFunction             String    后续方法名称
 * @param         isWait                         是否等待     0:不等待 1:等待
 * @param         isCheck                      是否校验     0:不校验 1:校验
 * 
 * @return 
 * @exception 
 */	      
function extSubmitForm(formId,submitFunction,isAutoRebind,rebindFunction,beforeFunction,afterFunction,isWait,isCheck){
	if(formId==null||formId==""||typeof(formId)=='undefined'){
		alert("formId【值:"+formId+"】所对应的form表单不存在，无法提交！");
		return;
	} 
	var targetForm=document.getElementById(formId);
	if(targetForm==null){
		alert("formId【值:"+formId+"】所对应的form表单不存在，无法提交！");
		return;
	}	
	if(submitFunction==null||submitFunction==""||typeof(submitFunction)=='undefined'){
		alert("Action提交方法（submitFunction）未设置，无法提交！");
		return;
	}	
	if(isAutoRebind==null||isAutoRebind!=false){
		isAutoRebind=true;
	}
	if(rebindFunction==null||typeof(rebindFunction)=='undefined'){
		rebindFunction="";
	}
	if(beforeFunction==null||typeof(beforeFunction)=='undefined'){
		beforeFunction="";
	}	
	if(afterFunction==null||typeof(afterFunction)=='undefined'){
		afterFunction="";
	}
	if(isWait==null||isWait!=true){
		isWait=false;
	}	
	if(isCheck==null||isCheck!=true){
		isCheck=false;
	}			
	
	
	if(isCheck==true){
		if(!extCheckForm( formId )){
			if(frameLanguage=="1"){
				extShowError("Form Filled Error!");
			}else{
				extShowError("表单填写错误,请更正！");
			}
			return;
		}
	}
 
	if(typeof(beforeFunction)=='function'||(typeof(beforeFunction)=='string'&&beforeFunction!='')){
		var flg;
		try{
			if(typeof(beforeFunction)=='function'){
				flg= beforeFunction();
			}else{
				flg=eval(beforeFunction+'()');
			}
		}catch(e){
			alert("前序方法不存在，或者函数存在错误（"+beforeFunction+"）,错误信息："+e.message);
			throw e;
			return;
		}
		if(!flg){ return; }
	}
	
	
	if(isWait==false){
	}else{
		extWait();
	}
	
	var frameFormType = Ext.getCmp(formId+"_frameFormType").getValue();
	if(frameFormType=='ajax'){
		var bakFunction =function (receiveJsonData){
			var backFlag;
			var isErrorFlag=true;
			if(isWait==false){
			}else{
				extNotify();
			}	
			if(isAutoRebind){
				var receiveJsonObject = eval('(' + receiveJsonData + ')');
				errorDialogFlag=true;
				isErrorFlag=extShowErrorByJson(receiveJsonObject);			 
			 	if(isErrorFlag){
			 		errorDialogFlag=false;
			 		backFlag= true;
			 	}else{
			 	 	errorDialogFlag=false;
			 		backFlag= false;
			 		extBindFormByJson(receiveJsonObject,targetForm);
			 	}
			}else{
				if(typeof(rebindFunction)=='function'||(typeof(rebindFunction)=='string'&&rebindFunction!='')){
					try{
						if(typeof(rebindFunction)=='function'){
							rebindFunction(receiveJsonData);
						}else{
							eval(rebindFunction+'(receiveJsonData)');
						}	
					}catch(e){
						alert("手动反帮方法不存在，或者函数存在错误（"+rebindFunction+"）错误信息："+e.message);
						throw e;
					}				
				}
				isErrorFlag=extShowErrorByForm(targetForm); 
				if(isErrorFlag){
			 		errorDialogFlag=false;
			 		backFlag= true;
			 	}else{
			 	 	errorDialogFlag=false;
			 		backFlag= false;
			 	} 
			}
 
			if(!isErrorFlag){
				extShowMessageByForm(targetForm);						
			 	if (typeof(self.workflowBtnHidden)=="function"){
			 		workflowBtnHidden(); 
			 	}
			 	if (typeof(self.workflowCompControl)=="function"){
			 		workflowCompControl();
			 	}
				if(typeof(afterFunction)=='function'||(typeof(afterFunction)=='string'&&afterFunction!='')){
						try{
							if(typeof(afterFunction)=='function'){
								afterFunction();
							}else{
								eval(afterFunction+'()');
							}	
						}catch(e){
							alert("后续方法不存在，或者函数存在错误（"+afterFunction+"）错误信息："+e.message);
							throw e;
							return;
						}	
				}		
			}
 	
		}
		extSubmitFormASync(formId,submitFunction,bakFunction)
	}
}


/**
 * 利用Ajax无缝提交目标Form,同步提交
 *
 * @param         formId                      String    目标form目标表单ID 
 * @param         submitFunction         String    提交方法名称
 * 
 * @return 
 * @exception 
 */	      
function extSubmitFormSync(formId,submitFunction){
	var targetForm=document.getElementById(formId);
	if(targetForm==null){
		alert("formId:"+formId+"不正确，找不到制定的from。");
		return ;
	}
	if(submitFunction==null||submitFunction==""||typeof(submitFunction)=='undefined'){
		alert("Action提交方法（submitFunction）未设置，无法提交！");
		return;
	}	
	var frameFormType = Ext.getCmp(formId+"_frameFormType").getValue();
	if(frameFormType=='ajax'){
		var url=targetForm.action+'?frameSubmitType=ajax&frameControlSubmitFunction='+submitFunction;
		var parameters = extAssemblePostParams(   formId    );		
		return extPostSync(url,parameters);
	}else{
		alert("目前只支持不含文件的form实时提交操作。");
		return ;
	}
}


/**
 * 利用Ajax无缝提交目标Form,异步提交
 *
 * @param           formId                 String    目标form目标表单ID  
 * @param           submitFunction   String    提交方法名称
 * @param           bakFunction        句柄        回调函数
 * @return 
 * @exception 
 */	      
function extSubmitFormASync(formId,submitFunction,bakFunction){
	var targetForm=document.getElementById(formId);
	if(targetForm==null){
		alert("formId:"+formId+"不正确，找不到制定的from。");
		return ;
	}
	if(submitFunction==null||submitFunction==""||typeof(submitFunction)=='undefined'){
		alert("Action提交方法（submitFunction）未设置，无法提交！");
		return;
	}	
	var targetForm=document.getElementById(formId);
	var url=targetForm.action+'?frameSubmitType=ajax&frameControlSubmitFunction='+submitFunction;
	var parameters = extAssemblePostParams( formId );		
	extPostASync(url,parameters,bakFunction);
}


/**
 * 设置组件Disabled
 *
 * @param           cmpId                 String    组件ID  
 * @param           flag                     boolean    提交方法名称
 * @return 
 * @exception 
 */	     
function setCmpDisabled(cmpId,flag){
	if(cmpId==null||cmpId==""||typeof(cmpId)=='undefined'){
		alert("setCmpDisabled方法错误，（cmpId）未设置！");
		return;
	}
	if(flag!=true){
		flag=false;
	}	
	var cmp = Ext.getCmp(cmpId);
	if(cmp==null){
		alert("setCmpDisabled方法错误，未找到Ext组件（cmpId:"+cmpId+"）！");
		return;
	}else{
		cmp.setDisabled(flag); 
	}
}


/**
 * 设置组件ReadOnly
 *
 * @param           cmpId                 String    组件ID  
 * @param           flag                     boolean    提交方法名称
 * @return 
 * @exception 
 */	     
function setCmpReadOnly(cmpId,flag){
	if(cmpId==null||cmpId==""||typeof(cmpId)=='undefined'){
		alert("setCmpDisabled方法错误，（cmpId）未设置！");
		return;
	}
	if(flag!=true){
		flag=false;
	}
	var cmp = Ext.getCmp(cmpId);
	if(cmp==null){
		alert("setCmpDisabled方法错误，未找到Ext组件（cmpId:"+cmpId+"）！");
		return;
	}else{
		cmp.setReadOnly(flag); 
	}
}


/**
 * 设置组件数值
 *
 * @param           cmpId                 String    组件ID  
 * @param           value                   String    组件值
 * @param           flag                     boolean    是否激活change事件
 * @return 
 * @exception 
 */	     
function setCmpValue(cmp,value,flag){
	var changeFlag=false;
	if(cmp==null||cmp==""||typeof(cmp)=='undefined'){
		alert("setCmpDisabled方法错误，（cmpId）未设置！");
		return;
	}
	var myCmp=null;
	if(typeof(cmp)=='string'){
		myCmp = Ext.getCmp(cmp);
	}else{
		myCmp=cmp;
	}
	if(value==null||value==""||typeof(value)=='undefined'){
		value="";
	}
	if(flag==null||typeof(flag)=="undefined"){
		changeFlag = false;
	}else{
		if(flag){changeFlag=flag;}
	}
 
	if(myCmp==null){
		alert("setCmpValue方法错误，未找到Ext组件（cmpId:"+cmp+"）！");
		return;
	}else{
		if(changeFlag){
			myCmp.setValue(value);
		}else{
			myCmp.suspendEvents();     
			myCmp.setValue(value);
			myCmp.resumeEvents(false); 
		}
	}	
}


/**
 * 取组件值
 *
 * @param           cmpId                 String    组件ID  
 * @return                                       Object   组件值
 * @exception 
 */	     
function getCmpValue(cmp){
	if(cmp==null||cmp==""||typeof(cmp)=='undefined'){
		alert("getCmpValue方法错误，（cmp）未设置！");
		return;
	}
	var myCmp=null;
	if(typeof(cmp)=='string'){
		myCmp = Ext.getCmp(cmpId);
	}else{
		myCmp=cmp;
	}
	if(myCmp==null){
		alert("getCmpValue方法错误，未找到Ext组件（cmpId:"+cmp+"）！");
		return;
	}else{
		return myCmp.getValue(); 
	}
}


function getCmpStrValue(cmp){
	if(cmp==null||cmp==""||typeof(cmp)=='undefined'){
		alert("getCmpStrValue方法错误，（cmp）未设置！");
		return;
	}
	if(typeof(cmp)=='string'){
		getCmpStrValueById(cmp);
	}else{
		getCmpStrValueByObj(cmp);
	}
}

/**
 * 取组件String值
 *
 * @param           cmpId                 String    组件ID  
 * @return                                       String   组件值
 * @exception 
 */	     
function getCmpStrValueById(cmpId){
	if(cmpId==null||cmpId==""||typeof(cmpId)=='undefined'){
		alert("getCmpStrValueById方法错误，（cmpId）未设置！");
		return;
	}
	var cmp = Ext.getCmp(cmpId);
	if(cmp==null){
		alert("getCmpStrValueById方法错误，未找到Ext组件（cmpId:"+cmpId+"）！");
		return;
	}else{
		return getCmpStrValueByObj(cmp);
   	}
}


/**
 * 取组件String值
 *
 * @param           cmp                    Object    组件对象
 * @return                                       
 * @exception 
 */	     
function getCmpStrValueByObj(cmp){
	var myValue="";
	if(cmp==null){
		alert("getCmpStrValueByObj方法错误，未找到Ext组件（cmp:"+cmp+"）！");
		return;
	}else{
		if(cmp.isXType('datefield') ){ //datefield
   			var value=cmp.getValue();
   			myValue = Ext.util.Format.date(value, cmp.format) ;  
   		}else if(cmp.isXType('combobox') ){
			var value=cmp.getValue();
			if(value==null){
					value="";
			}
			myValue=value;
		}else if(cmp.isXType('radiofield') ){ //datefield
   			 
   		}else if(cmp.isXType('hiddenfield') ){ //hiddenfield
   			var value=cmp.getValue();
   			myValue=value;
   		}else if(cmp.isXType('numberfield')){ //numberfield
   			var value=cmp.getValue();
   			if(value==null||value=='null'){
   				value='';
   			}
   			myValue=value;
   		}else if(cmp.isXType('textfield')){//其它所有录入1
   			var value=cmp.getValue();
   			myValue=value;
   		}
   	}
	return myValue; 
}
